﻿using System;
using System.Reflection;
//反射demo
namespace BugFixApplication {
    // 一个自定义特性 BugFix 被赋给类及其成员
    [AttributeUsage(AttributeTargets.Class |
    AttributeTargets.Constructor |
    AttributeTargets.Field |
    AttributeTargets.Method |
    AttributeTargets.Property,
    AllowMultiple = true)]
    //自定义 Attribute 
    public class DeBugInfo : System.Attribute {
        private int bugNo;
        private string developer;
        private string lastReview;
        public string message;

        public DeBugInfo(int bg, string dev, string d) {
            this.bugNo = bg;
            this.developer = dev;
            this.lastReview = d;
        }

        public int BugNo {
            get {
                return bugNo;
            }
        }
        public string Developer {
            get {
                return developer;
            }
        }
        public string LastReview {
            get {
                return lastReview;
            }
        }
        public string Message {
            get {
                return message;
            }
            set {
                message = value;
            }
        }
    }
    [DeBugInfo(45, "Zara Ali", "12/8/2012",
         Message = "Return type mismatch")]
    [DeBugInfo(49, "Nuha Ali", "10/10/2012",
         Message = "Unused variable")]
    class Rectangle {
        // 成员变量
        protected double length;
        protected double width;
        public Rectangle(double l, double w) {
            length = l;
            width = w;
        }
        [DeBugInfo(55, "Zara Ali", "19/10/2012",
             Message = "Return type mismatch")]
        public double GetArea() {
            return length * width;
        }
        [DeBugInfo(56, "Zara Ali", "19/10/2012")]
        public void Display() {
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Area: {0}", GetArea());
        }
    }//end class Rectangle  

    class ExecuteRectangle {
        static void Main(string[] args) {
            Rectangle r = new Rectangle(4.5, 7.5);
            r.Display();
            Type type = typeof(Rectangle);
            object ddd = type.GetCustomAttributes(true);
            // 遍历 Rectangle 类的特性,就是获取类上的注解
            foreach (Object attributes in type.GetCustomAttributes(false)) {
                DeBugInfo dbi = (DeBugInfo)attributes;
                if (null != dbi) {
                    Console.WriteLine("Bug no: {0}", dbi.BugNo);
                    Console.WriteLine("Developer: {0}", dbi.Developer);
                    Console.WriteLine("Last Reviewed: {0}",
                                             dbi.LastReview);
                    Console.WriteLine("Remarks: {0}", dbi.Message);
                }
            }

            // 遍历方法特性
            MethodInfo[] mdd = type.GetMethods();
            foreach (MethodInfo m in type.GetMethods()) {
                foreach (Attribute a in m.GetCustomAttributes(true)) {
                    //判断 a 是不是 DeBugInfo 类型，如果不是则直接 continue 掉
                    if (!a.GetType().Equals(typeof(DeBugInfo))) {
                        continue;
                    }
                    DeBugInfo dbi = (DeBugInfo)a;
                    if (null != dbi) {
                        Console.WriteLine("Bug no: {0}, for Method: {1}",
                                                      dbi.BugNo, m.Name);
                        Console.WriteLine("Developer: {0}", dbi.Developer);
                        Console.WriteLine("Last Reviewed: {0}",
                                                      dbi.LastReview);
                        Console.WriteLine("Remarks: {0}", dbi.Message);
                    }
                }
            }
            Console.ReadLine();
        }
    }
}